package middlewares

import (
	"github.com/iris-contrib/middleware/jwt"
	"github.com/kataras/iris/v12"
	"github.com/spf13/viper"
	"irisfarm/app/commons"
)

var jwtM *jwt.Middleware

func NewJwtMiddleware() {
	mySecret := viper.GetString("app.key")

	j := jwt.New(jwt.Config{
		//验证jwt的token
		ValidationKeyGetter: func(token *jwt.Token) (interface{}, error) {
			return []byte(mySecret), nil
		},

		//设置后，中如果签名方法不是常量间件会验证令牌是否使用特定的签名算法进行签名
		//，则可以使用ValidationKeyGetter回调来实现其他检查
		//重要的是要避免此处的安全问题：https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/
		//加密的方式
		SigningMethod: jwt.SigningMethodHS256,

		//验证未通过错误处理方式
		ErrorHandler: func(ctx iris.Context, e error) {
			h := commons.HttpError{}
			h.AuthError(ctx, e.Error())
		},

		//debug 模式
		//Debug: bool
	})

	jwtM = j
}

func JwtMiddlewareCheck(ctx iris.Context) {
	if err := jwtM.CheckJWT(ctx); err != nil {
		jwtM.Config.ErrorHandler(ctx, err)
		return
	}

	ctx.Next()
}
